package com.jammingpro.blog_system.controller;

import com.jammingpro.blog_system.constant.Constant;
import com.jammingpro.blog_system.model.BlogInfo;
import com.jammingpro.blog_system.model.Result;
import com.jammingpro.blog_system.service.BlogService;
import com.jammingpro.blog_system.utils.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/blog")
public class BlogInfoController {
    @Autowired
    private BlogService blogService;

    /**
     * 获取所有博客信息/博客列表
     * @return 博客列表
     */
    @RequestMapping("/list")
    public List<BlogInfo> getList() {
        return blogService.getBlogInfoList();
    }

    /**
     * 获取博客详细信息
     * @param id 博客id
     * @return 博客详细信息
     */
    @RequestMapping("/detail")
    public Result getDetail(Integer id, HttpServletRequest request) {
        log.info("[getDetail] : 获取id为{}的文章", id);

        // 获取token
        String token = request.getHeader(Constant.REQUEST_USER_TOKEN);
        if(token == null) {
            return Result.fail("登录信息错误");
        }

        // 获取当前用户id
        Integer userId = JwtUtils.getIdByToken(token);
        if(userId == null) {
            return Result.fail("登录信息错误");
        }

        // 获取文章作者id
        Integer authorId = blogService.getAuthorIdByBlogId(id);

        BlogInfo blogInfo = blogService.getBlogInfoById(id);
        if(blogInfo == null) {
            return Result.fail("文章丢失");
        }

        // 权限鉴定字段设置
        blogInfo.setIsAuthor(userId.equals(authorId));

        return Result.success(blogInfo);
    }

    /**
     * 新增博客
     * @param blogInfo 待添加博客
     * @return 添加结果
     */
    @RequestMapping("/add")
    public Result add(@RequestBody BlogInfo blogInfo, HttpServletRequest request) {
        // 校验博客标题及内容
        if(!StringUtils.hasLength(blogInfo.getTitle())) {
            return Result.fail("发布失败：博客标题不能为空");
        }
        if(!StringUtils.hasLength(blogInfo.getContent())) {
            return Result.fail("发布失败：博客内容不能为空");
        }

        // 获取token
        String token = request.getHeader(Constant.REQUEST_USER_TOKEN);
        if(token == null) {
            return Result.fail("登录信息错误");
        }

        // 获取当前用户id
        Integer userId = JwtUtils.getIdByToken(token);
        if(userId == null) {
            return Result.fail("登录信息错误");
        }

        blogInfo.setUserId(userId);

        // 插入数据库并返回响应
        Boolean ret = blogService.insertBlogInfo(blogInfo);
        if(ret == null) {
            return Result.fail("发布失败：请联系管理员");
        }
        return Result.success("发布成功");
    }

    /**
     * 删除博客
     * @param blogId 待删除博客id
     * @param request HTTP请求 - 获取token ->用户id 用于鉴定权限
     * @return 统一结果返回 - 删除是否成功提示
     */
    @RequestMapping("/delete")
    public Result delete(@RequestParam("id") Integer blogId, HttpServletRequest request) {
        // 请求参数校验
        if(blogId == null) {
            return Result.fail("请求参数错误");
        }
        // 获取token
        String token = request.getHeader(Constant.REQUEST_USER_TOKEN);
        if(token == null) {
            return Result.fail("登录信息错误");
        }

        // 获取当前用户id
        Integer userId = JwtUtils.getIdByToken(token);
        if(userId == null) {
            return Result.fail("登录信息错误");
        }

        // 权限鉴定
        Integer authorId = blogService.getAuthorIdByBlogId(blogId);
        log.info("authorId:{} userId{} delete {} article", authorId, userId, blogId);
        if(!authorId.equals(userId)) {
            return Result.fail("无权限");
        }

        // 删除博客
        Integer ret = blogService.deleteBlogByBlogId(blogId);
        if(ret <= 0) {
            return Result.fail("删除失败");
        }
        else {
            return Result.success("");
        }
    }

    /**
     * 更新文章
     * @param blogInfo 新的文章信息
     * @param request HTTP请求-》获取token-》id / 鉴权
     * @return 更新是否成功 - 统一结果返回
     */
    @RequestMapping("/update")
    public Result update(BlogInfo blogInfo, HttpServletRequest request) {
        // 请求参数校验
        if(blogInfo == null || blogInfo.getId() == null) {
            return Result.fail("请求参数错误");
        }
        if(!StringUtils.hasLength(blogInfo.getTitle())) {
            return Result.fail("标题不能为空");
        }
        if(!StringUtils.hasLength(blogInfo.getContent())) {
            return Result.fail("内容不能为空");
        }

        // 获取token
        String token = request.getHeader(Constant.REQUEST_USER_TOKEN);
        if(token == null) {
            return Result.fail("登录信息错误");
        }

        // 获取当前用户id
        Integer userId = JwtUtils.getIdByToken(token);
        if(userId == null) {
            return Result.fail("登录信息错误");
        }

        // 权限鉴定
        Integer authorId = blogService.getAuthorIdByBlogId(blogInfo.getId());
        log.info("authorId:{} userId{} update {} article", authorId, userId, blogInfo.getId());
        if(!authorId.equals(userId)) {
            return Result.fail("无权限");
        }

        Boolean ret = blogService.updateBlogInfo(blogInfo);

        if(ret == false) {
            Result.fail("更新出错，请联系管理员");
        }
        return Result.success("更新成功");
    }
}
